#!/bin/sh

###########################################################################
###########################################################################
# BUILD:
#
#     This tool is aimed to help Nevrax programmers to manage the
#     compilation of a "debug" and a "release" version of NeL, NeLNS,
#     and Snowballs2 (http://www.nevrax.org) based on the same source
#     code and with the possibility to not having to re-compile everything
#     each time the compilation mode (debug/release) change.
#
#     This script is a simple wrapper around the 'autogen.sh'/'configure'
#     commands ('build init nel/nelns/snowballs ...'), and the 'make'
#     command ('build nel/nelns/snowballs ...').
#
#     Example of use:
#
#         $ build mode release static
#         $ build init nel --enable-sound --enable-ai
#         $ build nel all install
#         $ build init nelns
#         $ build nelns all install
#         $ build init snowballs
#         $ build snowballs all install
#
#     As you can see there is no need to specify the installed directory
#     of NeL, etc ... These information are automaticly provided to the
#     configure script.
#
#     Check the following variables to get an idea of the place of the
#     source code, object, and installed files.
#
#     In silent mode it use a perl script named 'buildquiet' which
#     "cleanup" the 'make' command output to only print the compiled
#     file name instead of the compilation command line.
#
###########################################################################



###########################################################################
###########################################################################
###########################################################################
# VARIABLES

#MAKE_ARGS="-j20 CC=distcc CXX=distcc"
MAKE_ARGS="-j2"

# Set the source directory. Use the environment SRC_DIR variable, if it's
# not set, use $HOME/cvs as a default value
if test X"$RYZOM_PATH" = "X"
then
	RYZOM_PATH="$HOME/code"
fi
SRC_DIR="$RYZOM_PATH/../../code"

# Build diretories
BUILD_DEBUG="$SRC_DIR/build/debug"
BUILD_RELEASE="$SRC_DIR/build/release"

# Install directories
INSTALL_DEBUG="$SRC_DIR/install/debug"
INSTALL_RELEASE="$SRC_DIR/install/release"

# PKG config
STLPORT_DIR='/usr'
PYTHON_VERSION=2

# Compiler options
BUILD_CFLAGS="$CFLAGS -pipe"
BUILD_CXXFLAGS="$CXXFLAGS -pipe"

# Configure options
CONFIGURE_OPT="--disable-xmltest --enable-maintainer-mode"

###########################################################################

# Flag files associated to each mode
DEBUG_FILE="$RYZOM_PATH/.mode_debug"
STATIC_FILE="$RYZOM_PATH/.mode_static"
DYNAMIC_FILE="$RYZOM_PATH/.mode_dynamic"
SILENT_FILE="$RYZOM_PATH/.mode_silent"

# Specify the source code directory of each projects
NEL_SRC="$SRC_DIR/nel"
SNOWBALLS_SRC="$SRC_DIR/snowballs2"
NELNS_SRC="$SRC_DIR/nelns"


###########################################################################
###########################################################################
###########################################################################
# FUNCTIONS


###########################################################################
# Print command usage
printUsage()
{
    echo ""
    echo "Usage: $BUILD_CMD mode [debug] [static] [dynamic] [quiet]"
    echo "                 debug   -> turn ON/OFF debug compilation"
    echo "                 static  -> turn ON/OFF static linking"
    echo "                 dynamic -> turn ON/OFF dynamic linking"
    echo "                 quiet   -> turn ON/OFF quiet  compilation"
    echo ""
    echo "Usage: $BUILD_CMD [init] [nel | nelns | snowballs] [ARGS]"
    echo "                 init                  -> init. the build system"
    echo "                 nel, nelns, snowballs -> module to init./compile"
    echo ""
    echo "                 ARGS with init are passed to the 'configure' script"
    echo "                      otherwise they are passed to 'make'"
    echo ""
}


###########################################################################
# Print status
printMode()
{
	echo ""
	echo "Compilation modes :"
	echo ""
	echo "   Debug mode      : $DEBUG_MODE"
	echo ""
	echo "   Static linking  : $STATIC_MODE"
	echo "   Dynamic linking : $DYNAMIC_MODE"
	echo ""
	echo "   Quiet compilation  : $SILENT_MODE"
	echo ""
}


###########################################################################
# Print a message error (given in argument) and exit.
printError()
{
    local MSG=$1

    echo "*** ERROR: $MSG ***" >&2

    exit 1
}


###########################################################################
# Get the specific mode value and set the corresponding variable
getMode()
{
    local VAR=$1
    local FILE=$2

    if test -f "$FILE"
    then
        eval $VAR=ON
    else
        eval $VAR=OFF
    fi
}


###########################################################################
# Set a specific mode to ON if it's OFF, and to OFF if its ON
setMode()
{
    local VAR=$1
    local FILE=$2
    local OLD_VALUE NEW_VALUE

    # Get the current mode value
    OLD_VALUE=$(eval echo \$$VAR)

    if test X"$OLD_VALUE" = "XOFF"
    then
        # Set the MODE to ON in case it's OFF
        NEW_VALUE=ON
        touch -f $FILE || printError "cannot create mode file: $FILE"
    else
        # Set the MODE to OFF in case it's ON
        NEW_VALUE=OFF
        rm -f $FILE || printError "cannot delete mode file: $FILE"
    fi

    eval $VAR=$NEW_VALUE
}


###########################################################################
###########################################################################
###########################################################################

BUILD_CMD=`basename $0`

###########################################################################
# Get current the mode settings
getMode DEBUG_MODE   $DEBUG_FILE
getMode STATIC_MODE  $STATIC_FILE
getMode DYNAMIC_MODE $DYNAMIC_FILE
getMode SILENT_MODE  $SILENT_FILE


###########################################################################
###########################################################################
###########################################################################
# BUILDMODE / BUILD MODE call

if test "$BUILD_CMD" = 'buildmode' -o "$1" = 'mode'
then

    if test "$1" = 'mode'
    then
        shift
    fi

    # Print the mode values and exit if there is no argument
    if test $# -eq 0
    then
        printMode
        exit 0
    fi

    while test $# -gt 0
    do
        case $1 in

           debug)
               setMode DEBUG_MODE   $DEBUG_FILE
               ;;

           static)
               setMode STATIC_MODE  $STATIC_FILE
               ;;

           dynamic)
               setMode DYNAMIC_MODE $DYNAMIC_FILE
               ;;

           silent)
               setMode SILENT_MODE $SILENT_FILE
               ;;

           *)  echo "*** ERROR : $1 : Unknown building mode ***" >&2
               printUsage
               exit 1
               ;;

        esac

        shift

    done

    printMode

    exit 0

fi


###########################################################################
###########################################################################
# Default call: BUILD


###########################################################################
# Set the LD_LIBRARY_PATH variable to use the STLPORT
if test -n "$STLPORT_DIR"
then
    CONFIGURE_OPT="$CONFIGURE_OPT --with-stlport=$STLPORT_DIR"

    if test -z "$LD_LIBRARY_PATH"
    then
        LD_LIBRARY_PATH="$STLPORT_DIR/lib"
    else
        LD_LIBRARY_PATH="$STLPORT_DIR/lib:$LD_LIBRARY_PATH"
    fi
fi

# Set the configure option to use the rigth python version
if test -n "$PYTHON_VERSION"
then
    CONFIGURE_OPT="$CONFIGURE_OPT --with-python-version=$PYTHON_VERSION"
fi


###########################################################################

echo ""
echo "Using source directory : $SRC_DIR"

# If we are in debug mode we use the debug build and install directories
# Otherwise we use the release build and install directories
if test "$DEBUG_MODE" = 'ON'
then
    BUILD_DIR=$BUILD_DEBUG
    INSTALL_DIR=$INSTALL_DEBUG
    CONFIGURE_OPT="$CONFIGURE_OPT --with-debug"
    PATH="$INSTALL_DEBUG/bin:$PATH"
    LD_LIBRARY_PATH="$INSTALL_DEBUG/lib:LD_LIBRARY_PATH"
else
    BUILD_DIR=$BUILD_RELEASE
    INSTALL_DIR=$INSTALL_RELEASE
    BUILD_CFLAGS="$BUILD_CFLAGS"
    BUILD_CXXFLAGS="$BUILD_CXXFLAGS"
    PATH="$INSTALL_RELEASE/bin:$PATH"
    LD_LIBRARY_PATH="$INSTALL_RELEASE/lib:$LD_LIBRARY_PATH"
fi
export PATH
export LD_LIBRARY_PATH

# Set where to install and where find NeL library files
CONFIGURE_OPT="$CONFIGURE_OPT --prefix=$INSTALL_DIR --with-nel=$INSTALL_DIR"

# Get if it's a static and/or a dynamic compilation
if test "$STATIC_MODE" != "$DYNAMIC_MODE"
then
    if test "$STATIC_MODE" = 'ON'
    then
        CONFIGURE_OPT="--enable-static=yes --enable-shared=no $CONFIGURE_OPT"
    fi

    if test "$DYNAMIC_MODE" = 'ON'
    then
        CONFIGURE_OPT="--enable-static=no --enable-shared=yes $CONFIGURE_OPT"
    fi
else
    if test "$DYNAMIC_MODE" = 'OFF' -a "$STATIC_MODE" = 'OFF'
    then
        echo "*** ERROR: You must set building of static and/or dynamic libraries ***" >&2
        printUsage
        exit 1
    else
        echo "*** WARNING: Building both static and dynamic libraries ***" >&2
    fi
fi

if test $# -eq 0
then
    echo "*** ERROR: You have to decide what to do !... ***" >&2
    printUsage
    exit 1
fi


case $1 in

    # Modules initialisation
    init)
        BUILD_ARG=$2

        $RYZOM_PATH/tools/scripts/linux/buildmode

        case "$BUILD_ARG" in

            nel|nelns|snowballs)
                # Create the build directories
                if test ! -d $BUILD_DIR/$BUILD_ARG
                then
                    echo -n "Creating $BUILD_DIR/$ARG ..."
                    mkdir -p $BUILD_DIR/$BUILD_ARG \
                        || printError "cannot create the $BUILD_DIR/$BUILD_ARG directory"
                    echo " done"
                fi

                # Erase the already existing configuration cache
                rm -f $BUILD_DIR/$BUILD_ARG/config.cache \
                      $BUILD_DIR/$BUILD_ARG/config.h

	            shift
	            shift

                # Run the bootstrap script
	            cd  $SRC_DIR/$BUILD_ARG \
                    || printError "You must get the source files first !..."
                sh autogen.sh

                # Run the configure script
	            cd $BUILD_DIR/$BUILD_ARG
                CFLAGS="$BUILD_CFLAGS" CXXFLAGS="$BUILD_CXXFLAGS" \
                  $SRC_DIR/$BUILD_ARG/configure $CONFIGURE_OPT $* || exit 1
            ;;

        *)  echo "*** ERROR: $BUILD_ARG : Unknown module ***" >&2
            printUsage
            exit 1
            ;;

        esac
        ;;

    # Modules compilation
    nel|nelns|snowballs)
        BUILD_MODULE=$1
        shift

        # VPATH compilation and NeL include's Makefile.am command
        # '$(wildcard *.h)' doesn't like each other very much. So the
        # include files must be copied in NeL's compilation directory
        # before each build (in case one or several header files changed).
        if test "$BUILD_MODULE" = "nel"
        then
            # Delete any existing include file in the compilation
            # directory to avoid any kind of conflict
            if test -d $BUILD_DIR/nel/include/nel
            then
                cd $BUILD_DIR/nel/include/nel
                find . -type f -name \*.h -exec rm -rf \{\} \;
            else
                printError "You must get the source files first !..."
            fi

            # Copy the headers
            mkdir -p $BUILD_DIR/nel \
                && cp -RfPp $NEL_SRC/include $BUILD_DIR/nel

            # Remove from the compilation directory the useless CVS
            # information
            cd $BUILD_DIR/nel/include \
                && find . -prune -type d -name CVS -exec rm -rf \{\} \;

        fi

        cd $BUILD_DIR/$BUILD_MODULE || exit 1

        # Launch make in silent mode or not, depending of the config.
        if test $SILENT_MODE = 'ON'
        then
            make $MAKE_ARGS $* | buildquiet
        else
            make $MAKE_ARGS $*
        fi
        ;;

    *)  echo "*** ERROR: $1 : Unknown argument ***" >&2
        printUsage
        exit 1
        ;;

esac

exit 0

# End of file

